Setup

library("tidyverse")
library("ggpubr")
library("zoo")
setwd("/mnt/LocalData/behaviour/aDN/aDN_behaviour")



Colours …

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}
gg_color_hue(2)
[1] "#F8766D" "#00BFC4"



getwd()
[1] "/mnt/LocalData/behaviour/aDN/aDN_behaviour"
genotypes <- read_tsv("../2019_03_06_Courtship/genotype.tsv",col_names = TRUE)
genotypes
genotypes <- genotypes %>% 
  mutate(arena = round(if_else((fly_id %% 2) == 0,
                               fly_id/2,
                               (fly_id+1)/2),
                       digits = 0),
         treatment = genotype,
         sex = "male")
genotypes
arena_treatment <- genotypes %>% 
  unite("unique_arena",video,arena, remove = FALSE) %>% 
  select(unique_arena,treatment)
genotypes <- genotypes %>% select(-treatment,-arena)
arena_treatment
all_rawdata <- all_rawdata %>%
  full_join(x = all_rawdata, y = genotypes, by = c("FileName"="video","Id"="fly_id")) %>% 
  replace_na(list(genotype = "CS")) %>% 
  replace_na(list(sex = "female"))
There were 12 warnings (use warnings() to see them)
all_rawdata
all_rawdata <- all_rawdata %>% 
  unite("unique_arena",FileName,Arena, remove = FALSE) %>% 
  left_join(y=arena_treatment, by = "unique_arena") %>% 
  select(-unique_arena)
all_rawdata
# # added for testing purposes - function not used in actual code
# female_pos <- function(theta,dist,ori,xmale,xfemale){
#   yrel=calculate_yrel(theta,dist)
#   xrel=calculate_xrel(ori,xmale,xfemale,yrel)
#   return(c(xrel,yrel))
# }
# calculates relative y value based on data from feat.mat
calculate_yrel <- function(theta,dist){
  yrel=dist*cos(theta)
  return(yrel)
}
There were 12 warnings (use warnings() to see them)
calculate_xrel <- function(ori,xmale,xfemale,yrel,ppm=14.85){
  xmale_mm=xmale/ppm
  xfemale_mm=xfemale/ppm
  xrel = (xfemale_mm - (cos(ori)*yrel+xmale_mm))/(sin(ori))
  return(xrel)
} 
calculate_xrel_abs <- function(theta,dist){
  xrel=dist*sin(theta)
  return(xrel)
}
all_rawdata <- all_rawdata %>% 
  arrange(FileName,Arena,Frame)
all_rawdata$rel_y_other <- NA
all_rawdata$rel_x_other <- NA
all_rawdata$rel_x_abs_other <- NA
all_rawdata$rel_x_abs_corr_other <- NA
all_rawdata$rel_y_other[seq(1,nrow(all_rawdata),2)] = calculate_yrel(all_rawdata$facing_angle__rad[seq(1,nrow(all_rawdata),2)],
                                                         all_rawdata$dist_to_other__mm[seq(1,nrow(all_rawdata),2)])
all_rawdata$rel_x_other[seq(1,nrow(all_rawdata),2)] = calculate_xrel(ori = all_rawdata$ori__rad[seq(1,nrow(all_rawdata),2)],
                                                         xmale = all_rawdata$pos_x__px[seq(1,nrow(all_rawdata),2)],
                                                         xfemale = all_rawdata$pos_x__px[seq(2,nrow(all_rawdata),2)],
                                                         yrel = calculate_yrel(all_rawdata$facing_angle__rad[seq(1,nrow(all_rawdata),2)],
                                                                               all_rawdata$dist_to_other__mm[seq(1,nrow(all_rawdata),2)]))
all_rawdata$rel_x_abs_other[seq(1,nrow(all_rawdata),2)] = calculate_xrel_abs(all_rawdata$facing_angle__rad[seq(1,nrow(all_rawdata),2)],
                                                                 all_rawdata$dist_to_other__mm[seq(1,nrow(all_rawdata),2)])
all_rawdata$rel_y_other[seq(2,nrow(all_rawdata),2)] = calculate_yrel(all_rawdata$facing_angle__rad[seq(2,nrow(all_rawdata),2)],
                                                         all_rawdata$dist_to_other__mm[seq(2,nrow(all_rawdata),2)])
all_rawdata$rel_x_other[seq(2,nrow(all_rawdata),2)] = calculate_xrel(ori = all_rawdata$ori__rad[seq(2,nrow(all_rawdata),2)],
                                                         xmale = all_rawdata$pos_x__px[seq(2,nrow(all_rawdata),2)],
                                                         xfemale = all_rawdata$pos_x__px[seq(1,nrow(all_rawdata),2)],
                                                         yrel = calculate_yrel(all_rawdata$facing_angle__rad[seq(2,nrow(all_rawdata),2)],
                                                                               all_rawdata$dist_to_other__mm[seq(2,nrow(all_rawdata),2)]))
all_rawdata$rel_x_abs_other[seq(2,nrow(all_rawdata),2)] = calculate_xrel_abs(all_rawdata$facing_angle__rad[seq(2,nrow(all_rawdata),2)],
                                                                 all_rawdata$dist_to_other__mm[seq(2,nrow(all_rawdata),2)])
all_rawdata$rel_x_abs_corr_other[which(all_rawdata$rel_x_other<0)] = -all_rawdata$rel_x_abs_other[which(all_rawdata$rel_x_other<0)]
all_rawdata$rel_x_abs_corr_other[which(all_rawdata$rel_x_other>0)] = all_rawdata$rel_x_abs_other[which(all_rawdata$rel_x_other>0)]
all_rawdata
unique(all_rawdata$treatment)
[1] "C" "B" "D" "A" NA 
100*sum(is.na(all_rawdata$treatment))/nrow(all_rawdata)
[1] 1.449275
unique(all_rawdata$unique_fly[is.na(all_rawdata$treatment)])
[1] "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2_9"  "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2_10" "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_9_31" "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_9_32"
all_rawdata %>% 
  filter(FileName == "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2") %>% 
  filter(Id == 3) %>% 
  filter(dist_to_other__mm > 2.5) %>% 
  summarise(unique_fly = unique(unique_fly),
            l_ipsi = sum(wing_l_ang__rad<(-35*pi/180) & rel_x_abs_corr_other<0, na.rm = TRUE)/length(Frame),
            r_ipsi = sum(wing_r_ang__rad>(35*pi/180) & rel_x_abs_corr_other>0, na.rm = TRUE)/length(Frame),
            l_contra = sum(wing_l_ang__rad<(-35*pi/180) & rel_x_abs_corr_other>0, na.rm = TRUE)/length(Frame),
            r_contra = sum(wing_r_ang__rad>(35*pi/180) & rel_x_abs_corr_other<0, na.rm = TRUE)/length(Frame)
            )
all_rawdata <- all_rawdata %>% 
  arrange(FileName,Id,Frame) %>% 
  group_by(unique_fly) %>% 
  mutate(rollavg_dist_to_other = rollmean(dist_to_other__mm, 150, fill = c(NA,0,NA), align = c("center")))
all_rawdata

all_rawdata <- all_rawdata %>% select(-ipsi_wing,-contra_wing)
all_rawdata <- all_rawdata %>% 
  mutate(ipsi_wing = if_else(((wing_l_ang__rad<(-15*pi/180) & 
                                rel_x_abs_corr_other<=0) | 
                               (wing_r_ang__rad>(15*pi/180) & 
                                  rel_x_abs_corr_other>=0)),1,0),
         contra_wing = if_else(((wing_l_ang__rad<(-15*pi/180) & 
                                rel_x_abs_corr_other>0) | 
                               (wing_r_ang__rad>(15*pi/180) & 
                                  rel_x_abs_corr_other<0)),1,0)
         ) %>% 
  replace_na(list(ipsi_wing = 0)) %>%
  replace_na(list(contra_wing = 0))
all_rawdata

all_rawdata <- all_rawdata %>% 
  mutate(ipsi_wing_ang = if_else(((wing_l_ang__rad<(-15*pi/180) & 
                                rel_x_abs_corr_other<=0) | 
                               (wing_r_ang__rad>(15*pi/180) & 
                                  rel_x_abs_corr_other>=0)),1,0),
         contra_wing = if_else(((wing_l_ang__rad<(-15*pi/180) & 
                                rel_x_abs_corr_other>0) | 
                               (wing_r_ang__rad>(15*pi/180) & 
                                  rel_x_abs_corr_other<0)),1,0)
         ) %>% 
  replace_na(list(ipsi_wing = 0)) %>%
  replace_na(list(contra_wing = 0))
all_rawdata
all_rawdata <- all_rawdata %>% 
  mutate(ipsi_wing_ang = if_else(rel_x_abs_corr_other>0,
                                 wing_r_ang__rad,
                                 wing_l_ang__rad),
         contra_wing_ang = if_else(rel_x_abs_corr_other<0,
                                 wing_r_ang__rad,
                                 wing_l_ang__rad)
         )
all_rawdata

all_rawdata <- all_rawdata %>% 
  mutate(ipsi_wing_len = if_else(rel_x_abs_corr_other>0,
                                 wing_r_len__px,
                                 wing_l_len__px),
         contra_wing_len = if_else(rel_x_abs_corr_other<0,
                                 wing_r_len__px,
                                 wing_l_len__px)
         )
Warning messages:
1: Unknown or uninitialised column: 'dist_to_other__mm'. 
2: Unknown or uninitialised column: 'dist_to_other__mm'. 
3: Unknown or uninitialised column: 'dist_to_other__mm'. 
4: Unknown or uninitialised column: 'dist_to_other__mm'. 
5: Unknown or uninitialised column: 'facing_angle__rad'. 
6: Unknown or uninitialised column: 'facing_angle__rad'. 
7: Unknown or uninitialised column: 'facing_angle__rad'. 
8: Unknown or uninitialised column: 'facing_angle__rad'. 
all_rawdata

LS0tCnRpdGxlOiAiKipNYWxlIGNvdXJ0c2hpcCBiZWhhdmlvdXIgLSBhRE4gPiBUTlQgLSBpcHNpIGNvbnRyYSoqIgphdXRob3I6ICJBYXJvbiBNLiBBbGxlbiIKZGF0ZTogIjEwIE1hcmNoIDIwMjAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCjxici8+Cjxici8+CgojICoqU2V0dXAqKgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgiZ2dwdWJyIikKbGlicmFyeSgiem9vIikKc2V0d2QoIi9tbnQvTG9jYWxEYXRhL2JlaGF2aW91ci9hRE4vYUROX2JlaGF2aW91ciIpCmBgYAoKCjxici8+Cjxici8+CgojIyMgQ29sb3VycyAuLi4KIApgYGB7cn0KZ2dfY29sb3JfaHVlIDwtIGZ1bmN0aW9uKG4pIHsKICBodWVzID0gc2VxKDE1LCAzNzUsIGxlbmd0aCA9IG4gKyAxKQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dCn0KYGBgCgpgYGB7cn0KZ2dfY29sb3JfaHVlKDIpCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7cn0KZ2V0d2QoKQpgYGAKCgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpnZW5vdHlwZXMgPC0gcmVhZF90c3YoIi4uLzIwMTlfMDNfMDZfQ291cnRzaGlwL2dlbm90eXBlLnRzdiIsY29sX25hbWVzID0gVFJVRSkKZ2Vub3R5cGVzCmBgYAoKCgoKCmBgYHtyfQpnZW5vdHlwZXMgPC0gZ2Vub3R5cGVzICU+JSAKICBtdXRhdGUoYXJlbmEgPSByb3VuZChpZl9lbHNlKChmbHlfaWQgJSUgMikgPT0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseV9pZC8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZseV9pZCsxKS8yKSwKICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAwKSwKICAgICAgICAgdHJlYXRtZW50ID0gZ2Vub3R5cGUsCiAgICAgICAgIHNleCA9ICJtYWxlIikKZ2Vub3R5cGVzCmBgYAoKCgpgYGB7cn0KYXJlbmFfdHJlYXRtZW50IDwtIGdlbm90eXBlcyAlPiUgCiAgdW5pdGUoInVuaXF1ZV9hcmVuYSIsdmlkZW8sYXJlbmEsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgc2VsZWN0KHVuaXF1ZV9hcmVuYSx0cmVhdG1lbnQpCmdlbm90eXBlcyA8LSBnZW5vdHlwZXMgJT4lIHNlbGVjdCgtdHJlYXRtZW50LC1hcmVuYSkKYXJlbmFfdHJlYXRtZW50CmBgYAoKCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyByYXdkYXRhX2xpc3QgPC0gbGlzdC5maWxlcygiLi4vIixyZWN1cnNpdmUgPSBUUlVFKSAlPiUgc3RyX3N1YnNldCgiX0FMTERBVEEuY3N2IikgJT4lIHN0cl9zdWJzZXQoIl9NYWxlXyIpCiMgYWxsX3Jhd2RhdGEgPC0gdGliYmxlKCkKIyBmb3IgKHJhd2RhdGFfZmlsZSBpbiByYXdkYXRhX2xpc3QpIHsKIyAgIHRlbXAgPC0gcmVhZF9jc3YocGFzdGUwKCIuLi8iLHJhd2RhdGFfZmlsZSkscHJvZ3Jlc3MgPSBGQUxTRSkKIyAgIGFsbF9yYXdkYXRhIDwtIGJpbmRfcm93cyhhbGxfcmF3ZGF0YSx0ZW1wKQojIH0KYGBgCgoKCgoKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhIDwtIHJlYWRfY3N2KCJhbGxfcmF3ZGF0YS5jc3YiKQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgc2VsZWN0KC1nZW5vdHlwZSkKYWxsX3Jhd2RhdGEKYGBgCgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmFsbF9yYXdkYXRhIDwtIGFsbF9yYXdkYXRhICU+JQogIGZ1bGxfam9pbih4ID0gYWxsX3Jhd2RhdGEsIHkgPSBnZW5vdHlwZXMsIGJ5ID0gYygiRmlsZU5hbWUiPSJ2aWRlbyIsIklkIj0iZmx5X2lkIikpICU+JSAKICByZXBsYWNlX25hKGxpc3QoZ2Vub3R5cGUgPSAiQ1MiKSkgJT4lIAogIHJlcGxhY2VfbmEobGlzdChzZXggPSAiZmVtYWxlIikpCmFsbF9yYXdkYXRhCmBgYAoKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhIDwtIGFsbF9yYXdkYXRhICU+JSAKICB1bml0ZSgidW5pcXVlX2FyZW5hIixGaWxlTmFtZSxBcmVuYSwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBsZWZ0X2pvaW4oeT1hcmVuYV90cmVhdG1lbnQsIGJ5ID0gInVuaXF1ZV9hcmVuYSIpICU+JSAKICBzZWxlY3QoLXVuaXF1ZV9hcmVuYSkKYWxsX3Jhd2RhdGEKYGBgCgpgYGB7cn0KYWxsX3Jhd2RhdGEgJT4lIGZpbHRlcihnZW5vdHlwZT09IkNTIikKYGBgCgoKCmBgYHtyfQojICMgYWRkZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgLSBmdW5jdGlvbiBub3QgdXNlZCBpbiBhY3R1YWwgY29kZQojIGZlbWFsZV9wb3MgPC0gZnVuY3Rpb24odGhldGEsZGlzdCxvcmkseG1hbGUseGZlbWFsZSl7CiMgICB5cmVsPWNhbGN1bGF0ZV95cmVsKHRoZXRhLGRpc3QpCiMgICB4cmVsPWNhbGN1bGF0ZV94cmVsKG9yaSx4bWFsZSx4ZmVtYWxlLHlyZWwpCiMgICByZXR1cm4oYyh4cmVsLHlyZWwpKQojIH0KCgoKCiMgY2FsY3VsYXRlcyByZWxhdGl2ZSB5IHZhbHVlIGJhc2VkIG9uIGRhdGEgZnJvbSBmZWF0Lm1hdApjYWxjdWxhdGVfeXJlbCA8LSBmdW5jdGlvbih0aGV0YSxkaXN0KXsKICB5cmVsPWRpc3QqY29zKHRoZXRhKQogIHJldHVybih5cmVsKQp9CmNhbGN1bGF0ZV94cmVsIDwtIGZ1bmN0aW9uKG9yaSx4bWFsZSx4ZmVtYWxlLHlyZWwscHBtPTE0Ljg1KXsKICB4bWFsZV9tbT14bWFsZS9wcG0KICB4ZmVtYWxlX21tPXhmZW1hbGUvcHBtCiAgeHJlbCA9ICh4ZmVtYWxlX21tIC0gKGNvcyhvcmkpKnlyZWwreG1hbGVfbW0pKS8oc2luKG9yaSkpCiAgcmV0dXJuKHhyZWwpCn0gCmNhbGN1bGF0ZV94cmVsX2FicyA8LSBmdW5jdGlvbih0aGV0YSxkaXN0KXsKICB4cmVsPWRpc3Qqc2luKHRoZXRhKQogIHJldHVybih4cmVsKQp9CgpgYGAKCgoKCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgYXJyYW5nZShGaWxlTmFtZSxBcmVuYSxGcmFtZSkKCmFsbF9yYXdkYXRhJHJlbF95X290aGVyIDwtIE5BCmFsbF9yYXdkYXRhJHJlbF94X290aGVyIDwtIE5BCmFsbF9yYXdkYXRhJHJlbF94X2Fic19vdGhlciA8LSBOQQphbGxfcmF3ZGF0YSRyZWxfeF9hYnNfY29ycl9vdGhlciA8LSBOQQoKYWxsX3Jhd2RhdGEkcmVsX3lfb3RoZXJbc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildID0gY2FsY3VsYXRlX3lyZWwoYWxsX3Jhd2RhdGEkZmFjaW5nX2FuZ2xlX19yYWRbc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfcmF3ZGF0YSRkaXN0X3RvX290aGVyX19tbVtzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0pCgphbGxfcmF3ZGF0YSRyZWxfeF9vdGhlcltzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0gPSBjYWxjdWxhdGVfeHJlbChvcmkgPSBhbGxfcmF3ZGF0YSRvcmlfX3JhZFtzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtYWxlID0gYWxsX3Jhd2RhdGEkcG9zX3hfX3B4W3NlcSgxLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZlbWFsZSA9IGFsbF9yYXdkYXRhJHBvc194X19weFtzZXEoMixucm93KGFsbF9yYXdkYXRhKSwyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlyZWwgPSBjYWxjdWxhdGVfeXJlbChhbGxfcmF3ZGF0YSRmYWNpbmdfYW5nbGVfX3JhZFtzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfcmF3ZGF0YSRkaXN0X3RvX290aGVyX19tbVtzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0pKQoKYWxsX3Jhd2RhdGEkcmVsX3hfYWJzX290aGVyW3NlcSgxLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSA9IGNhbGN1bGF0ZV94cmVsX2FicyhhbGxfcmF3ZGF0YSRmYWNpbmdfYW5nbGVfX3JhZFtzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3Jhd2RhdGEkZGlzdF90b19vdGhlcl9fbW1bc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildKQoKCmFsbF9yYXdkYXRhJHJlbF95X290aGVyW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSA9IGNhbGN1bGF0ZV95cmVsKGFsbF9yYXdkYXRhJGZhY2luZ19hbmdsZV9fcmFkW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3Jhd2RhdGEkZGlzdF90b19vdGhlcl9fbW1bc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildKQoKYWxsX3Jhd2RhdGEkcmVsX3hfb3RoZXJbc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildID0gY2FsY3VsYXRlX3hyZWwob3JpID0gYWxsX3Jhd2RhdGEkb3JpX19yYWRbc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWFsZSA9IGFsbF9yYXdkYXRhJHBvc194X19weFtzZXEoMixucm93KGFsbF9yYXdkYXRhKSwyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmZW1hbGUgPSBhbGxfcmF3ZGF0YSRwb3NfeF9fcHhbc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5cmVsID0gY2FsY3VsYXRlX3lyZWwoYWxsX3Jhd2RhdGEkZmFjaW5nX2FuZ2xlX19yYWRbc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3Jhd2RhdGEkZGlzdF90b19vdGhlcl9fbW1bc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildKSkKCmFsbF9yYXdkYXRhJHJlbF94X2Fic19vdGhlcltzZXEoMixucm93KGFsbF9yYXdkYXRhKSwyKV0gPSBjYWxjdWxhdGVfeHJlbF9hYnMoYWxsX3Jhd2RhdGEkZmFjaW5nX2FuZ2xlX19yYWRbc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9yYXdkYXRhJGRpc3RfdG9fb3RoZXJfX21tW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSkKCgphbGxfcmF3ZGF0YSRyZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaChhbGxfcmF3ZGF0YSRyZWxfeF9vdGhlcjwwKV0gPSAtYWxsX3Jhd2RhdGEkcmVsX3hfYWJzX290aGVyW3doaWNoKGFsbF9yYXdkYXRhJHJlbF94X290aGVyPDApXQphbGxfcmF3ZGF0YSRyZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaChhbGxfcmF3ZGF0YSRyZWxfeF9vdGhlcj4wKV0gPSBhbGxfcmF3ZGF0YSRyZWxfeF9hYnNfb3RoZXJbd2hpY2goYWxsX3Jhd2RhdGEkcmVsX3hfb3RoZXI+MCldCgphbGxfcmF3ZGF0YQpgYGAKCgoKCmBgYHtyfQp1bmlxdWUoYWxsX3Jhd2RhdGEkdHJlYXRtZW50KQpgYGAKCmBgYHtyfQoxMDAqc3VtKGlzLm5hKGFsbF9yYXdkYXRhJHRyZWF0bWVudCkpL25yb3coYWxsX3Jhd2RhdGEpCgpgYGAKCmBgYHtyfQphbGxfcmF3ZGF0YVtpcy5uYShhbGxfcmF3ZGF0YSR0cmVhdG1lbnQpLF0KYGBgCgoKYGBge3J9CnVuaXF1ZShhbGxfcmF3ZGF0YSR1bmlxdWVfZmx5W2lzLm5hKGFsbF9yYXdkYXRhJHRyZWF0bWVudCldKQpgYGAKCgoKCmBgYHtyfQp3cml0ZV9jc3YoYWxsX3Jhd2RhdGEsImFsbF9yYXdkYXRhLmNzdiIpCmBgYAoKCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMykgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIuNSkgJT4lIAogIHN1bW1hcmlzZSh1bmlxdWVfZmx5ID0gdW5pcXVlKHVuaXF1ZV9mbHkpLAogICAgICAgICAgICBsX2lwc2kgPSBzdW0od2luZ19sX2FuZ19fcmFkPCgtMzUqcGkvMTgwKSAmIHJlbF94X2Fic19jb3JyX290aGVyPDAsIG5hLnJtID0gVFJVRSkvbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgcl9pcHNpID0gc3VtKHdpbmdfcl9hbmdfX3JhZD4oMzUqcGkvMTgwKSAmIHJlbF94X2Fic19jb3JyX290aGVyPjAsIG5hLnJtID0gVFJVRSkvbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgbF9jb250cmEgPSBzdW0od2luZ19sX2FuZ19fcmFkPCgtMzUqcGkvMTgwKSAmIHJlbF94X2Fic19jb3JyX290aGVyPjAsIG5hLnJtID0gVFJVRSkvbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgcl9jb250cmEgPSBzdW0od2luZ19yX2FuZ19fcmFkPigzNSpwaS8xODApICYgcmVsX3hfYWJzX2NvcnJfb3RoZXI8MCwgbmEucm0gPSBUUlVFKS9sZW5ndGgoRnJhbWUpCiAgICAgICAgICAgICkKCmBgYAoKCgoKCgpgYGB7cn0KYWxsX3Jhd2RhdGEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGFycmFuZ2UoRmlsZU5hbWUsSWQsRnJhbWUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgbXV0YXRlKHJvbGxhdmdfZGlzdF90b19vdGhlciA9IHJvbGxtZWFuKGRpc3RfdG9fb3RoZXJfX21tLCAxNTAsIGZpbGwgPSBjKE5BLDAsTkEpLCBhbGlnbiA9IGMoImNlbnRlciIpKSkKYWxsX3Jhd2RhdGEKYGBgCgoKCgpgYGB7cn0Kd3JpdGVfY3N2KGFsbF9yYXdkYXRhLCJhbGxfcmF3ZGF0YS5jc3YiKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTh9CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKG1heF93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPigzNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBsZWZ0X3dpbmdfaW5kZXggPSAxMDAqc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLTM1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1sZWZ0X3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICByaWdodF93aW5nX2luZGV4ID0gMTAwKnN1bSh3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDM1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1yaWdodF93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgYm90aF93aW5nX2luZGV4ID0gMTAwKnN1bShtaW5fd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oMzUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWJvdGhfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDQscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiZWl0aGVyIHdpbmciLCJib3RoIHdpbmdzIiwibGVmdCB3aW5nIiwicmlnaHQgd2luZyIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDQsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTh9CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKG1heF93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPigzNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBpcHNpX3dpbmdfaW5kZXggPSAxMDAqKHN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC0zNSpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPigzNSpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPj0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1pcHNpX3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBjb250cmFfd2luZ19pbmRleCA9IDEwMCooc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLTM1KnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHdpbmdfcl9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oMzUqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1jb250cmFfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCgogIApnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoImVpdGhlciB3aW5nIiwiaXBzaSB3aW5nIiwiY29udHJhIHdpbmciKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTh9CndpbmdfdGhyZXNoIDwtIDE1CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKG1heF93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBpcHNpX3dpbmdfaW5kZXggPSAxMDAqKHN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC13aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPj0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1pcHNpX3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBjb250cmFfd2luZ19pbmRleCA9IDEwMCooc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLXdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHdpbmdfcl9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4od2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1jb250cmFfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCgogIApnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoImVpdGhlciB3aW5nIiwiaXBzaSB3aW5nIiwiY29udHJhIHdpbmciKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTh9CndpbmdfdGhyZXNoIDwtIDE1CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKG1heF93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBpcHNpX3dpbmdfaW5kZXggPSAxMDAqKHN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC13aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPj0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1pcHNpX3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBjb250cmFfd2luZ19pbmRleCA9IDEwMCooc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLXdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHdpbmdfcl9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4od2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1jb250cmFfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCgoKCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHJhdGlvID0gKChzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtd2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTw9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHdpbmdfcl9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4od2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT49MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgKChzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtd2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1yYXRpbykpICsKICAgIGdlb21fYm94cGxvdCgpCgoKCgoKCgogIApnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoImVpdGhlciB3aW5nIiwiaXBzaSB3aW5nIiwiY29udHJhIHdpbmciLCJpcHNpOmNvbnRyYSIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDQsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKCgpgYGB7cn0KYWxsX3Jhd2RhdGEgPC0gYWxsX3Jhd2RhdGEgJT4lIHNlbGVjdCgtaXBzaV93aW5nLC1jb250cmFfd2luZykKYGBgCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgbXV0YXRlKGlwc2lfd2luZyA9IGlmX2Vsc2UoKCh3aW5nX2xfYW5nX19yYWQ8KC0xNSpwaS8xODApICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXI8PTApIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2luZ19yX2FuZ19fcmFkPigxNSpwaS8xODApICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlcj49MCkpLDEsMCksCiAgICAgICAgIGNvbnRyYV93aW5nID0gaWZfZWxzZSgoKHdpbmdfbF9hbmdfX3JhZDwoLTE1KnBpLzE4MCkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlcj4wKSB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpbmdfcl9hbmdfX3JhZD4oMTUqcGkvMTgwKSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXI8MCkpLDEsMCkKICAgICAgICAgKSAlPiUgCiAgcmVwbGFjZV9uYShsaXN0KGlwc2lfd2luZyA9IDApKSAlPiUKICByZXBsYWNlX25hKGxpc3QoY29udHJhX3dpbmcgPSAwKSkKYWxsX3Jhd2RhdGEKYGBgCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CgoKcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgaXBzaV93aW5nX2luZGV4ID0gMTAwKihzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtd2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTw9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHdpbmdfcl9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4od2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT49MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9aXBzaV93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgY29udHJhX3dpbmdfaW5kZXggPSAxMDAqKHN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC13aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSh3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KHdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9Y29udHJhX3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQoKCgoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGlwc2lfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGNvbnRyYV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQoKCgoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMyxwMixwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJpcHNpIHJhdyIsImlwc2kgY29sdW1uIiwiY29udHJhIHJhdyIsImNvbnRyYSBjb2x1bW4iKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD02fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShpcHNpX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyMCpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGlwc2lfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oaXBzaV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzAqcGkvMTgwKSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShpcHNpX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnA1IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGlwc2lfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKCgoKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDMscDIscDQscDUpLAogICAgICAgICAgbGFiZWxzID0gYygiaXBzaSwgPjE1ZGVnIiwiaXBzaSwgPjIwZGVnIiwiaXBzaSwgPjI1ZGVnIiwiaXBzaSwgPjMwZGVnIiwiaXBzaSwgPjM1ZGVnIiksCiAgICAgICAgICBoanVzdCA9IDAsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gNSwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9Nn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDE1KnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oY29udHJhX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyMCpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGNvbnRyYV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShjb250cmFfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDMwKnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oY29udHJhX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnA1IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGNvbnRyYV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQoKCgoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMyxwMixwNCxwNSksCiAgICAgICAgICBsYWJlbHMgPSBjKCJjb250cmEsID4xNWRlZyIsImNvbnRyYSwgPjIwZGVnIiwiY29udHJhLCA+MjVkZWciLCJjb250cmEsID4zMGRlZyIsImNvbnRyYSwgPjM1ZGVnIiksCiAgICAgICAgICBoanVzdCA9IDAsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gNSwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKCgoKCgpgYGB7cn0KYWxsX3Jhd2RhdGEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIG11dGF0ZShpcHNpX3dpbmdfYW5nID0gaWZfZWxzZSgoKHdpbmdfbF9hbmdfX3JhZDwoLTE1KnBpLzE4MCkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlcjw9MCkgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aW5nX3JfYW5nX19yYWQ+KDE1KnBpLzE4MCkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyPj0wKSksMSwwKSwKICAgICAgICAgY29udHJhX3dpbmcgPSBpZl9lbHNlKCgod2luZ19sX2FuZ19fcmFkPCgtMTUqcGkvMTgwKSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyPjApIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2luZ19yX2FuZ19fcmFkPigxNSpwaS8xODApICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlcjwwKSksMSwwKQogICAgICAgICApICU+JSAKICByZXBsYWNlX25hKGxpc3QoaXBzaV93aW5nID0gMCkpICU+JQogIHJlcGxhY2VfbmEobGlzdChjb250cmFfd2luZyA9IDApKQphbGxfcmF3ZGF0YQpgYGAKCgoKCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgbXV0YXRlKGlwc2lfd2luZ19hbmcgPSBpZl9lbHNlKHJlbF94X2Fic19jb3JyX290aGVyPjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmdfcl9hbmdfX3JhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZ19sX2FuZ19fcmFkKSwKICAgICAgICAgY29udHJhX3dpbmdfYW5nID0gaWZfZWxzZShyZWxfeF9hYnNfY29ycl9vdGhlcjwwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5nX3JfYW5nX19yYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmdfbF9hbmdfX3JhZCkKICAgICAgICAgKQphbGxfcmF3ZGF0YQpgYGAKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQp3aW5kIDwtIDYwMApwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoaXBzaV93aW5nX2FuZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk+KDE1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oYWJzKGlwc2lfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigyMCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oYWJzKGlwc2lfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigyNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oYWJzKGlwc2lfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigzMCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oYWJzKGlwc2lfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigzNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKCgoKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDMscDIscDQscDUpLAogICAgICAgICAgbGFiZWxzID0gYygiaXBzaSwgPjE1ZGVnIiwiaXBzaSwgPjIwZGVnIiwiaXBzaSwgPjI1ZGVnIiwiaXBzaSwgPjMwZGVnIiwiaXBzaSwgPjM1ZGVnIiksCiAgICAgICAgICBoanVzdCA9IDAsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gNSwKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKCgoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQp3aW5kIDwtIDYwMApwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoY29udHJhX3dpbmdfYW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKT4oMTUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoY29udHJhX3dpbmdfYW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKT4oMjAqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGFicyhjb250cmFfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigyNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oYWJzKGNvbnRyYV93aW5nX2FuZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk+KDMwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoY29udHJhX3dpbmdfYW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKT4oMzUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCgoKCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAzLHAyLHA0LHA1KSwKICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyYSwgPjE1ZGVnIiwiY29udHJhLCA+MjBkZWciLCJjb250cmEsID4yNWRlZyIsImNvbnRyYSwgPjMwZGVnIiwiY29udHJhLCA+MzVkZWciKSwKICAgICAgICAgIGhqdXN0ID0gMCwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSA1LAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCgoKCgoKCgoKCgpgYGB7cn0KYWxsX3Jhd2RhdGEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIG11dGF0ZShpcHNpX3dpbmdfbGVuID0gaWZfZWxzZShyZWxfeF9hYnNfY29ycl9vdGhlcj4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5nX3JfbGVuX19weCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZ19sX2xlbl9fcHgpLAogICAgICAgICBjb250cmFfd2luZ19sZW4gPSBpZl9lbHNlKHJlbF94X2Fic19jb3JyX290aGVyPDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmdfcl9sZW5fX3B4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5nX2xfbGVuX19weCkKICAgICAgICAgKQphbGxfcmF3ZGF0YQpgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQp0ZW1wIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyKnBpLzMpKSAlPiUKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPj0gKDApKSAlPiUKICBmaWx0ZXIod2luZ19sX2FuZ19fcmFkID4gKC0yKnBpLzMpKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkIDwgKDIqcGkvMykpICU+JQogIGZpbHRlcih3aW5nX2xfYW5nX19yYWQgPD0gMCkgJT4lCiAgZmlsdGVyKHdpbmdfcl9hbmdfX3JhZCA+PSAwKSAlPiUKICBmaWx0ZXIoZGlzdF90b193YWxsX19tbSA+IDIpICMlPiUKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDE1KnBpLzE4MCkpIAoKICAKICAKcDEgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDIgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDMgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDQgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpybSh0ZW1wKQpgYGAKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KdGVtcCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMi41KSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMipwaS8zKSkgJT4lCiAgZmlsdGVyKG1pbl93aW5nX2FuZ19fcmFkID49ICgwKSkgJT4lCiAgZmlsdGVyKHdpbmdfbF9hbmdfX3JhZCA+ICgtMipwaS8zKSkgJT4lCiAgZmlsdGVyKHdpbmdfcl9hbmdfX3JhZCA8ICgyKnBpLzMpKSAlPiUKICBmaWx0ZXIod2luZ19sX2FuZ19fcmFkIDw9ICgwKSkgJT4lCiAgZmlsdGVyKHdpbmdfcl9hbmdfX3JhZCA+PSAoMCkpICU+JQogIGZpbHRlcihkaXN0X3RvX3dhbGxfX21tID4gMikgJT4lCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDE1KnBpLzE4MCkpIAoKICAKICAKcDEgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDIgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDMgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDQgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpybSh0ZW1wKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK